package btreegui;

import btreetestat.BTreeController;
import btreetestat.TreeException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
import javax.swing.JOptionPane;

/**
 *
 * @author Bart
 */
public class ButtonController implements ActionListener {

    private BTreeGUI frame;

    public ButtonController(BTreeGUI frame) {
        this.frame = frame;
    }

    public void actionPerformed(ActionEvent e) {

        switch (frame.getBtns().indexOf(e.getSource())) {
            case 0: //Neuer Baum --> Verzweigungsgrad
                frame.setbTreeController(new BTreeController(Integer.parseInt(frame.getJsVerzweigungsgrad())));
                frame.getDrawTreePanel().setSearchValue("");
                frame.updateTree();
                ;
                break;
            case 1: //btEinfügen
                if (frame.getbTreeController() == null) {
                    JOptionPane.showMessageDialog(frame, "Sie müssen erst einen Baum erzeugen!");
                } else {
                    try {
                        int val = Integer.parseInt(frame.getJsEinfSuchRand());
                        frame.getbTreeController().pasteValue(val);
                        frame.setJsEinfSuchRand(val + 1);
                        frame.updateTree();
                    } catch (TreeException ex) {
                        JOptionPane.showMessageDialog(frame, ex.getMessage(), "Fehler", JOptionPane.ERROR_MESSAGE);
                    }
                }
                break;
            case 2: //btSuchen
                if (frame.getbTreeController() == null) {
                    JOptionPane.showMessageDialog(frame, "Sie müssen erst einen Baum erzeugen!");
                } else {
                    try {
                        String val = frame.getJsEinfSuchRand();
                        frame.getDrawTreePanel().setSearchValue(val);
                        frame.updateTree();
                    } catch (Exception ex) {
                        JOptionPane.showMessageDialog(frame, ex.getMessage(), "Fehler", JOptionPane.ERROR_MESSAGE);
                    }
                }
                break;
            case 3: //btRandomEinfügen
                if (frame.getbTreeController() == null) {
                    JOptionPane.showMessageDialog(frame, "Sie müssen erst einen Baum erzeugen!");
                } else {
                    try {
                        frame.getBtRandomEinfügen().setEnabled(false);
                        if (frame.getbTreeController() == null) {
                            JOptionPane.showMessageDialog(frame, "Sie müssen erst einen Baum erzeugen!");
                        } else {
                            helperRand(frame.getRandMin(), frame.getRandMax(), Integer.parseInt(frame.getJsEinfSuchRand()), 0); //Zufallswerte einfügen
                        }
                        frame.getBtRandomEinfügen().setEnabled(true);
                        frame.updateTree(); //Baum erstellen
                    } catch (Exception ex) {
                        JOptionPane.showMessageDialog(frame, ex.getMessage(), "Fehler", JOptionPane.ERROR_MESSAGE);
                    }
                }
                break;
            case 4:
                try {
                    //btLöschen
                    frame.getbTreeController().removeValue(Integer.parseInt(frame.getJtLöschen()));
                    frame.updateTree();
                } catch (TreeException ex) {
                    JOptionPane.showMessageDialog(frame, ex.getMessage(), "Fehler", JOptionPane.ERROR_MESSAGE);
                }
                break;
            default:
                break;
        }
    }

    private void helperRand(int startNumber, int endNumber, int anzahlInt, int durchlauf) {
        int walkNr = durchlauf;
        if (3 == walkNr) {  //Abbrechen der Rekursion
            return;
        }
        int anzMinDubletten = 0;
        Collection<Integer> lste;
        try {
            lste = randomPick(startNumber, endNumber, anzahlInt);     //konfiguration der Gui prüfen
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(frame, "Bitte Eingabe überprüfen:\n" + ex.getMessage(), "Fehler", JOptionPane.ERROR_MESSAGE);
            frame.getBtRandomEinfügen().setEnabled(true);
            return;
        }

        try {
            for (Iterator<Integer> it = lste.iterator(); it.hasNext();) {   //Werte in Baum einfügen
                Integer integer = it.next();
                frame.getbTreeController().pasteValue(integer);
            }
        } catch (Exception ex) {
            anzMinDubletten++;
        }
        if (0 != anzMinDubletten) {      //bei mehrfachwerten rekusion
            walkNr++;
            helperRand(frame.getRandMin(), frame.getRandMax(), anzMinDubletten, walkNr);
        }
    }

    Collection<Integer> randomPick(int startNumber, int endNumber, int count) {     //Liste mit Zufallswerten erzeugen
        // Generate a list of all numbers from start to endNumber
        List<Integer> workerArray = new ArrayList<Integer>();
        for (int i = startNumber; i < endNumber; i++) {
            workerArray.add(i);
        }
        Collections.shuffle(workerArray);// Shuffle them
        return workerArray.subList(0, count);// Pick count items.
    }
}
